#include <algorithm>
#include <iostream>
#define N 100
long long dp[N];
using namespace std;
int main() {
  int n, m;
  cin >> n >> m;
  // 初始条件
  dp[0] = 1;
  for (int i = 1; i <= n; ++i) {
    if (i < m) {
      // i这个位置上共有两种情况：放或不放
      // 前面有dp[i - 1]种情况，因此一共有2*dp[i - 1]这么多种情况
      // 这是n小于m的情况，即不管怎么放，总不会爆炸
      dp[i] = 2 * dp[i - 1];
    }
    // 这种情况对应的是n正好等于m,这个时候我就需要在原来的基础上减去每个坑都放的这一种情况
    else if (i == m) {
      dp[i] = 2 * dp[i - 1] - 1;
    }
    // 现在是i>m的情况，那么这种情况下，我就需要考虑减去前面所有会炸的情况了
    else {
      dp[i] = 2 * dp[i - 1] - dp[i - m - 1];
    }
  }
  cout << dp[n];
  return 0;
}